package fr.skolian.utils.sql
{
	import flash.data.SQLConnection;
	import flash.data.SQLMode;
	import flash.data.SQLResult;
	import flash.data.SQLStatement;
	import flash.events.ErrorEvent;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.SQLEvent;
	import flash.filesystem.File;
	
	import fr.skolian.utils.log.Log;
	
	
/*Skolian - Content management system for primary school - Copyright (c) 2011 - Olivier Gianotti - This file is part of Skolian. Skolian is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Skolian is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Skolian.  If not, see <http://www.gnu.org/licenses/>.
contact : ogianotti@gmail.com 

Skolian - Application de gestion de contenus pédagogiques en école primaire. Copyright (C) 2011 - Olivier Gianotti - Ce fichier est une partie de Skolian. Skolian est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier au titre des clauses de la Licence Publique Générale GNU, telle que publiée par la Free Software Foundation ; soit la version 2 de la Licence, ou (à votre discrétion) une version ultérieure quelconque. Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE ; sans même une garantie implicite de COMMERCIABILITE ou DE CONFORMITE A UNE UTILISATION PARTICULIERE. Voir la Licence Publique Générale GNU pour plus de détails. Vous devriez avoir reçu un exemplaire de la Licence Publique Générale GNU avec ce programme ; si ce n'est pas le cas, consultez <http://www.gnu.org/licenses/>.
contact : ogianotti@gmail.com 
*/

public class SQLHelper extends EventDispatcher
	{
		private var conn:SQLConnection;
		private var requete:SQLStatement;
		private var _result:SQLResult;
		private var _connected:Boolean;
		
		public function SQLHelper()
		{
			super();
		}
		
		public function get result():SQLResult
		{
			return _result;
		}

		public function connect(db:String):void{
			conn = new SQLConnection();
			requete = new SQLStatement();
			var dbFile:File = File.applicationStorageDirectory.resolvePath(db);	//Lien du fichier de base de donnée
			if(!dbFile.parent.exists)dbFile.parent.createDirectory();
			conn.addEventListener(SQLEvent.OPEN, onDBConnect);
			if(!dbFile.exists)conn.open(dbFile,SQLMode.CREATE);
			else conn.open(dbFile);
		}
		
		private function onDBConnect(event:SQLEvent	):void{
			_connected = true;
			conn.removeEventListener(SQLEvent.OPEN, onDBConnect);
			requete.sqlConnection = conn;	//Configuration de l'instance de requête avec la base
			dispatchEvent(new Event(Event.CONNECT));
		}
		
		public function exec(req:String):void{
			if(!_connected)return;
			if(requete)clearRequest();
			requete = new SQLStatement();
			requete.sqlConnection = conn;
			requete.addEventListener(SQLEvent.RESULT, onComplete);
			requete.text=req;
			try{
				requete.execute();
			}catch(error:Error){
				Log.error("execute error "+error);
				//dispatchEvent(new ErrorEvent(ErrorEvent.ERROR,false,false,error.message));
			}
		}
		
		private function clearRequest():void
		{
			requete.clearParameters();
			requete.cancel();
			requete = null;
		}
		
		private function onComplete(event:SQLEvent=null):void{
			requete.removeEventListener(SQLEvent.RESULT, onComplete);
			_result = requete.getResult();
			
			dispatchEvent(new Event(Event.COMPLETE));
		}
		
		
		public function get connected():Boolean
		{
			return _connected;
		}
	}
}